package com.dave.admin.modular.boss.service.impl;

import cn.hutool.core.img.Img;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileTypeUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.ftp.Ftp;
import cn.hutool.extra.ftp.FtpMode;
import com.dave.admin.modular.boss.service.OssService;
import com.dave.admin.common.exception.AssertionEx;
import com.dave.admin.modular.boss.dto.OssUpResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;
import java.util.UUID;

/**
 * oss上传管理Service实现类
 * @author Dave
 */
@Service
public class OssServiceImpl implements OssService {
    private static final Logger LOGGER = LoggerFactory.getLogger(OssServiceImpl.class);

    @Value("${ftp.oss.url}")
    private String FTP_OSS_URL;
    @Value("${ftp.oss.ip}")
    private String FTP_OSS_IP;
    @Value("${ftp.oss.port}")
    private int FTP_OSS_PORT;
    @Value("${ftp.oss.username}")
    private String FTP_OSS_USERNAME;
    @Value("${ftp.oss.password}")
    private String FTP_OSS_PASSWORD;
    @Value("${ftp.oss.rootName}")
    private String FTP_OSS_ROOT_NAME;
    @Value("${ftp.oss.dirPath}")
    private String FTP_OSS_DIR_PATH;

    /**
     * 文件上传
     * TODO 实现的不好 后续改进
     */
    @Override
    public OssUpResult fileUp(MultipartFile multipartFile) {
        LOGGER.info("上传文件请求");
        OssUpResult ossUpResult = new OssUpResult();
        try (Ftp ftp = new Ftp(FTP_OSS_IP, FTP_OSS_PORT, FTP_OSS_USERNAME, FTP_OSS_PASSWORD, Charset.defaultCharset(), FtpMode.Passive)) {
            //开启ftp上传
            // 文件名称规则 ： 上传文件名 + UUID
            String fileName = UUID.randomUUID().toString() + "." + FileUtil.extName(multipartFile.getOriginalFilename());

            LOGGER.debug("文件:{} 正在上传,to path {}", fileName, FTP_OSS_DIR_PATH);
            boolean isSuccess = ftp.upload(FTP_OSS_DIR_PATH, fileName, multipartFile.getInputStream());
            LOGGER.debug("文件:{} 上传完成,to path {} 结果: {}", fileName, FTP_OSS_DIR_PATH, isSuccess);


            ossUpResult.setFileName(fileName);
            ossUpResult.setFileSrc(FTP_OSS_URL + FTP_OSS_ROOT_NAME + FTP_OSS_DIR_PATH + fileName);

//  压缩
//            String extName = StrUtil.isBlank(FileUtil.extName(multipartFile.getOriginalFilename())) ? FileTypeUtil.getType(multipartFile.getInputStream()) : FileUtil.extName(multipartFile.getOriginalFilename());
//            //压缩上传一份 使用的hutool工具 支持 jpg
//            if (ImgUtil.IMAGE_TYPE_JPG.equals(extName)) {
//                ByteArrayOutputStream out = new ByteArrayOutputStream();
//                Img.from(multipartFile.getInputStream())
//                        //压缩比率
//                        .setQuality(0.2)
//                        // 水印图片
//                        .pressImage(ImgUtil.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("templates/img/watermark.png")),
//                                0, 0, 0.8f)
//                        .write(out);
//                //返回上一层
//                ftp.cd("..");
//                boolean thum = ftp.upload(FTP_OSS_DIR_PATH + "thum/", fileName, new ByteArrayInputStream(out.toByteArray()));
//                LOGGER.info("文件:{} 上传完成,to path {} 结果: {}", fileName, FTP_OSS_DIR_PATH + "thum/", thum);
//                ossUpResult.setFileSrc(FTP_OSS_URL + FTP_OSS_DIR_PATH + "thum/" + fileName);
//            }

            return ossUpResult;
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
            AssertionEx.state(false, "很遗憾，上传失败");
        }

        return ossUpResult;
    }
}
